package com.sheng.leetcode.year2022.month12.day16;

import org.junit.Test;

/**
 * @author by ls
 * @date 2022/12/16
 * <p>
 * 1785. 构成特定和需要添加的最少元素<p>
 * <p>
 * 给你一个整数数组 nums ，和两个整数 limit 与 goal 。数组 nums 有一条重要属性：abs(nums[i]) <= limit 。<p>
 * 返回使数组元素总和等于 goal 所需要向数组中添加的 最少元素数量 ，添加元素 不应改变 数组中 abs(nums[i]) <= limit 这一属性。<p>
 * 注意，如果 x >= 0 ，那么 abs(x) 等于 x ；否则，等于 -x 。<p>
 * <p>
 * 示例 1：<p>
 * 输入：nums = [1,-1,1], limit = 3, goal = -4<p>
 * 输出：2<p>
 * 解释：可以将 -2 和 -3 添加到数组中，数组的元素总和变为 1 - 1 + 1 - 2 - 3 = -4 。<p>
 * <p>
 * 示例 2：<p>
 * 输入：nums = [1,-10,9,1], limit = 100, goal = 0<p>
 * 输出：1<p>
 * <p>
 * 提示：<p>
 * 1 <= nums.length <= 10^5<p>
 * 1 <= limit <= 10^6<p>
 * -limit <= nums[i] <= limit<p>
 * -10^9 <= goal <= 10^9<p>
 * <p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/minimum-elements-to-add-to-form-a-given-sum">1785. 构成特定和需要添加的最少元素</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class LeetCode1785 {

    @Test
    public void test01() {
//        int[] nums = {1, -1, 1};
//        int limit = 3, goal = -4;
//        int[] nums = {1, -10, 9, 1};
//        int limit = 100, goal = 0;
        int[] nums = {9999999, 9999999, 9999999, 9999999, 9999999, 9999999, 9999999, 9999999, 9999999, 9999999, 9999999};
        int limit = 9999999, goal = 0;
        System.out.println(new Solution().minElements(nums, limit, goal));
    }
}

class Solution {
    public int minElements(int[] nums, int limit, int goal) {
        /**
         * 数组 nums 内的所有元素的绝对值都小于等于 limit
         * 要使数组 nums 的元素总和等于 goal，最少需要添加多少个元素
         */
        long sum = 0;
        for (int num : nums) {
            sum += num;
        }
        long value = Math.abs(sum - goal);
        if (value % limit == 0) {
            return (int) (value / limit);
        } else {
            return (int) (value / limit + 1);
        }
    }
}
